package com.example.retrofit;

import android.os.Bundle;
import android.util.Log;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.retrofit.proxy.BuyHouse;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.concurrent.BlockingDeque;

import retrofit2.Retrofit;

/**
 *  1.查看retrofit的create方法的源码中采用动态代理技术代理Api接口
 *  2.调用接口中的方法，代理方法，通过反射技术读取方法全部信息
 *      （1）反射读取方法上注解以及路径 @GET @POST
 *      （2）反射读取方法的参数以及注解
 *          @Query 拼接在网址上
 *          @Field form表单提交参数
 *          @Body   请求体
 *          @MuiltPartBody.Part 文件上传
 *          @Path 网址占位符
 *  3.将读取到信息构建Okhttp的Request对象，底层使用okhttp发起请求---》okhttp的response----》GsonConvertFactory帮助解析----实体类
 *
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("")
                .build();
        //关键动态代理，代理Api接口
        retrofit.create(Api.class);

//        Proxy.newProxyInstance(getClassLoader(), new Class[]{Api.class}, new InvocationHandler() {
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                //通过反射技术读取方法全部信息
//                //构建请求对象
//                return null;
//            }
//        });

//        //代理对象 BuyHouse功能
//        BuyHouse buyHouse = (BuyHouse) Proxy.newProxyInstance(getClassLoader(), new Class[]{BuyHouse.class}, new InvocationHandler() {
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                //代理方法
//                String name = method.getName();
//                Log.d("TAG", "代理接口中的方法名称: " + name);
//                Log.d("TAG", "代理接口中的参数: " + args);
//                //北京打9折
//                if (name.equals("buyHouse")) {
//                    if (args[0].equals("北京")) {
//                        return (float) args[1] * 0.9;
//                    }
//                }
//                return (float) args[1];
//
//            }
//        });
//
//        float money = buyHouse.buyHouse("北京", 10000);
//        Log.d("TAG", "卖房子: " + money);

    }
}